;; https://projecteuler.net/problem=30

;; Digit fifth powers
;; Problem 30

;; Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:

;;     1634 = 1^4 + 6^4 + 3^4 + 4^4
;;     8208 = 8^4 + 2^4 + 0^4 + 8^4
;;     9474 = 9^4 + 4^4 + 7^4 + 4^4

;; As 1 = 1^4 is not a sum it is not included.

;; The sum of these numbers is 1634 + 8208 + 9474 = 19316.

;; Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.


(import
 (except (rnrs base) let-values map)
 (only (guile)
       lambda* λ)
 ;; (srfi srfi-69)  ; hash tables
 (srfi srfi-1)  ; reduce
 (contract)
 (prefix (lib math) math:)
 (lib print-utils))


(define-with-contract test
  (require (math:natural-number? num))
  (ensure (boolean? <?>))
  (λ (num exponent)
    (= (math:sum
        (map (λ (n) (expt n exponent))
             (math:digits num)))
       num)))


(math:sum
 (let ([maximum (expt 10 6)]
       [start 1]
       [exponent 5])
   (let iter ([num start] [numbers '()])
     (cond
      [(> num maximum) numbers]
      [(test num exponent)
       (print (number->string num)
              "can is sum of its digits' fifth powers:"
              (math:digits num)
              (map (λ (n) (expt n 5)) (math:digits num)))
       (iter (+ num 1) (cons num numbers))]
      [else
       (iter (+ num 1) numbers)]))))


;; But how do I know, that these are all numbers? How can I
;; be sure, that higher numbers all fail the test?
